package com.dp.client.views.vuelo;

import java.util.Date;
import java.util.List;

import com.dp.client.dto.VueloDTO;
import com.dp.client.servicios.vuelo.IServiciosVuelo;
import com.dp.client.servicios.vuelo.IServiciosVueloAsync;
import com.dp.client.util.Alerts;
import com.google.gwt.cell.client.ButtonCell;
import com.google.gwt.cell.client.DateCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.cellview.client.SimplePager;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;

public class TablaVuelos extends Composite {
	SimplePager pager;
	static DateTimeFormat format = DateTimeFormat.getShortDateTimeFormat();
	ListDataProvider<VueloDTO> provider;
	DataGrid<VueloDTO> dataGrid;
	IServiciosVueloAsync servicio = GWT.create( IServiciosVuelo.class );
	public TablaVuelos( ) {
		VerticalPanel vertical = new VerticalPanel();
		vertical.setSize("100%", "100%");
		initWidget(vertical);
		pager = new SimplePager();
		pager.setSize("100%", "25px");
		dataGrid = new DataGrid<VueloDTO>();
		dataGrid.setSize("100%", "700px");
		vertical.add(pager);
		vertical.add(dataGrid);
		provider = new ListDataProvider<VueloDTO>();	
		addDataColumns();
		addControlColumns();
		provider.addDataDisplay( dataGrid );
		pager.setDisplay(dataGrid);
		pager.setPageSize(10);
	}
	static String evalAns[] = {"Despegar" , "Aterrizar", "Llego a Destino","Cancelado"};
	static String stateName[] = {"En Origen","Volando","En Destino" , "Cancelado" };
	static String evalState( int id ){
		return evalAns[ id ];
	}
	void addControlColumns(){
		ButtonCell button = new ButtonCell();
		Column<VueloDTO, String > aplicarCambio = new Column<VueloDTO, String>(button) {
			@Override
			public String getValue(VueloDTO object) {
				return evalState( object.idEstado );
			}
		}; 
		Column<VueloDTO,String> cancelarVuelo = new Column<VueloDTO, String>(button) {
			@Override
			public String getValue(VueloDTO object) {
				return "Cancelar";
			}
		};
		aplicarCambio.setFieldUpdater( new FieldUpdater<VueloDTO, String>() {
			@Override
			public void update(int index, VueloDTO object, String value) {
				avanzarEstado(object);
			}
		});
		cancelarVuelo.setFieldUpdater( new FieldUpdater<VueloDTO, String>() {
			@Override
			public void update(int index, VueloDTO object, String value) {
				cancelar(object);
			}
		});
		dataGrid.addColumn( aplicarCambio , "Cambio");
		dataGrid.addColumn( cancelarVuelo , "Cancelar" );
	}
	
	void avanzarEstado( final VueloDTO object ){
		if( object.idEstado > 1 ){
			if( object.idEstado == 2 ) Alerts.crearAlerta("El vuelo ya llego a su destino");
			else Alerts.crearAlerta("El vuelo fue cancelado");
			return;
		}
		if( object.idEstado == 1 ){ 
			if( Alerts.confirmacionGenerica("El vuelo "+ object.id + " llego a su destino?" ) == false ) 
				return;
			else	llamadaServerAvanzar(object);
		} else {
			popUpResumenPaquetes( object );
		}
	}
	
	void popUpResumenPaquetes( final VueloDTO object ){
		ConfirmacionDespegeDialog dialog = new ConfirmacionDespegeDialog( object , this);
		dialog.show();
		dialog.center();
	}
	
	void llamadaServerAvanzar( final VueloDTO object ){
		servicio.avanzarEstado( object , new AsyncCallback<Boolean>() {
			@Override
			public void onSuccess(Boolean result) {
				object.idEstado++;
				object.estado = stateName[ object.idEstado ];
				dataGrid.redraw();
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}
	
	void cancelar( final VueloDTO object){
		if( object.idEstado > 1 ){
			Alerts.crearAlerta("No se puede cancelar");
			return;
		}
		if( Alerts.confirmacionGenerica("Desea cancelar este vuelo?") == false ) return;
		servicio.cancelarVuelo( object , new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
			@Override
			public void onSuccess(Boolean result) {
				object.idEstado = 3;
				object.estado = stateName[ object.idEstado ];
				dataGrid.redraw();
				Alerts.crearAlerta("El vuelo se cancelo correctamente");
			}
		});
		
	}
	
	void addDataColumns(){

		TextColumn<VueloDTO> id = new TextColumn<VueloDTO>() {
			@Override
			public String getValue(VueloDTO object) {
				return object.id + "";
			}
		};
		TextColumn<VueloDTO> origen = new TextColumn<VueloDTO>() {
			@Override
			public String getValue(VueloDTO object) {
				return object.almacenOrigen.getDescripcion();
			}
		};
		TextColumn<VueloDTO> destino = new TextColumn<VueloDTO>() {
			@Override
			public String getValue(VueloDTO object) {
				return object.almacenDestino.getDescripcion();
			}
		};
		TextColumn<VueloDTO  > fechaSalida = new TextColumn<VueloDTO>( ) {
			@Override
			public String getValue(VueloDTO object) {
				return format.format(object.fechaHoraSalida);
			}
		};
		TextColumn<VueloDTO  > fechaLLegada = new TextColumn<VueloDTO>( ) {
			@Override
			public String getValue(VueloDTO object) {
				return format.format(object.fechaHoraLlegada);
			}
		};
		TextColumn<VueloDTO> estado = new TextColumn<VueloDTO>() {
			@Override
			public String getValue(VueloDTO object) {
				return object.estado;
			}
		};
		//dataGrid.addColumn( conexion , "Conexion" );
		dataGrid.addColumn( id , "ID" );
		dataGrid.addColumn( origen , "A. Origen" );
		dataGrid.addColumn( destino , "A. Destino" );
		dataGrid.addColumn( fechaSalida , "F. Salida" );
		dataGrid.addColumn( fechaLLegada, "F. Llegada" );
		dataGrid.addColumn( estado , "Estado" );
	}
	public void setData(List<VueloDTO> values){
		provider.setList( values );
	}
}
